package com.ylr.admin.framework.controller.web;

import com.ylr.base.common.annotation.Resubmit;
import com.ylr.base.common.dto.PageDto;
import com.ylr.user.common.dto.user.UserDto;
import com.ylr.user.common.dto.user.UserEnumDto;
import com.ylr.user.common.enums.UserEnum;
import com.ylr.base.common.jsr303.group.OrderSearch;
import com.ylr.base.common.jsr303.group.Save;
import com.ylr.base.common.jsr303.group.Update;
import com.ylr.base.common.tool.Result;
import com.ylr.user.common.vo.user.UserFormVo;
import com.ylr.user.common.vo.user.UserVo;
import com.ylr.admin.framework.service.UserService;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2023-05-12 14:47:15
 * className: UserController
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/web/user")
@AllArgsConstructor
public class UserController {

    private static final Logger log = LoggerFactory.getLogger(UserController.class);

    private final UserService userService;

    /**
     * 保存用户接口
     * <p>
     * 此接口会校验是否重复提交
     * @param userVo 参数对象
     */
    @Resubmit(message = "保存用户")
    @PostMapping("/save")
    public Result<Object> saveUser(@Validated(Save.class) @RequestBody UserVo userVo) {
        log.info("web => 开始保存用户操作。{}", userVo);

        // 手机号、邮箱号、登录别名三者不能全空
        if (ObjectUtils.allNull(userVo.getMobile(), userVo.getEmail(), userVo.getLoginName())) {
            log.info("手机号、邮箱号、登录别名参数存在错误值");
            return Result.requestFail("手机号、邮箱号、登录别名三者不能全空");
        }
        if (UserEnum.isLeaderFail(userVo.getLeaderStatus())) {
            log.info("部门领导枚举值错误");
            return Result.requestFail("部门领导值错误");
        }

        userService.saveUser(userVo);

        log.info("web => 保存用户操作结束");
        return Result.success();
    }

    /**
     * 分页查询用户接口
     * @param userFormVo 参数对象
     * @return 用户分页数据
     */
    @PostMapping("/page/list")
    public Result<PageDto<UserDto>> pageUserList(@Validated(OrderSearch.class) @RequestBody UserFormVo userFormVo) {
        log.info("web => 开始分页查询用户操作。{}", userFormVo);

        PageDto<UserDto> page = userService.pageUserList(userFormVo);

        log.info("web => 分页查询用户操作结束");
        return Result.success(page);
    }

    /**
     * 获取用户接口
     * @param id 用户主键
     * @return 用户数据
     */
    @GetMapping("/get")
    public Result<UserDto> getUser(@NotNull(message = "用户主键不能为空") Long id) {
        log.info("web => 开始获取用户操作。id={}", id);

        UserDto userDto = userService.getUser(id);

        log.info("web => 获取用户操作结束");
        return Result.success(userDto);
    }

    /**
     * 获取用户页面枚举数据接口
     * @return 页面枚举数据
     */
    @GetMapping("/page/enums")
    public Result<UserEnumDto> getPageEnums() {
        log.info("web => 开始获取用户页面枚举数据操作");

        UserEnumDto userEnumDto = userService.getPageEnums();

        log.info("web => 获取用户页面枚举数据操作结束");
        return Result.success(userEnumDto);
    }

    /**
     * 获取角色关联的用户接口
     * 根据角色键获取数据
     * @param roleKey 角色键
     * @return 用户列表
     */
    @GetMapping("/role/user-list")
    public Result<List<UserDto>> getRoleUserList(@RequestParam("roleKey") String roleKey) {
        log.info("web => 开始获取角色关联的用户操作。roleKey={}", roleKey);

        List<UserDto> userList = userService.getRoleUserList(roleKey);

        log.info("web => 获取角色关联的用户操作结束");
        return Result.success(userList);
    }

    /**
     * 修改用户接口
     * <p>
     * 此接口会校验是否重复提交
     * @param userVo 参数对象
     */
    @Resubmit(spEL = "'updateUserBase-'.concat(#userVo.id)", message = "修改用户")
    @PostMapping("/update/base")
    public Result<Object> updateUserBase(@Validated(Update.class) @RequestBody UserVo userVo) {
        log.info("web => 开始修改用户操作。{}", userVo);

        userService.updateUser(userVo);

        log.info("web => 修改用户操作结束");
        return Result.success();
    }

    /**
     * 删除用户接口
     * @param idList 主键列表
     */
    @Resubmit(message = "删除用户")
    @PostMapping("/delete")
    public Result<Object> deleteUser(@Size(min = 1, message = "主键列表不能为空") @RequestBody List<Long> idList) {
        log.info("web => 开始删除用户操作。idList={}", idList);

        userService.deleteUser(idList);

        log.info("web => 删除用户操作结束");
        return Result.success();
    }

}
